////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2017 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  camxifecsstats14.h
/// @brief Colum Sum stats v1.4 class declarations
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef CAMXIFECSSTATS14_H
#define CAMXIFECSSTATS14_H

#include "camxispstatsmodule.h"

CAMX_NAMESPACE_BEGIN

static const UINT32 CSInputDepth                    = 12;   ///< Input depth to CS stats
static const UINT32 CSOutputDepth                   = 16;   ///< Output bit depths of CS stats

// Register range from the SWI/HPG
static const UINT32 CSStats14MaxRegionWidth         = 4;    ///< Maximum CS stats region width
static const UINT32 CSStats14MinRegionWidth         = 2;    ///< Minimum CS stats region width

static const UINT32 CSStats14MinHorizRegions        = 5;    ///< Minimum CS stats horizontal region
static const UINT32 CSStats14MaxHorizRegions        = 1560; ///< Maximum CS stats horizontal region
static const UINT32 CSStats14MinVertRegions         = 1;    ///< Minimum CS stats vertical region
static const UINT32 CSStats14MaxVertRegions         = 4;    ///< Maximum CS stats vertical region

CAMX_BEGIN_PACKED

/// @brief CS Stats Configuration
struct IFECS14RegionConfig
{
    IFE_IFE_0_VFE_STATS_CS_RGN_OFFSET_CFG   regionOffset;   ///< CS stats region offset config
    IFE_IFE_0_VFE_STATS_CS_RGN_NUM_CFG      regionNum;      ///< CS stats region number config
    IFE_IFE_0_VFE_STATS_CS_RGN_SIZE_CFG     regionSize;     ///< CS stats region size config
} CAMX_PACKED;

CAMX_END_PACKED

struct IFECS14RegCmd
{
    IFECS14RegionConfig   regionConfig;   ///< CS stats region config
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief CS Stats14 Class Implementation
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class CSStats14 final : public ISPStatsModule
{
public:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Create
    ///
    /// @brief  Create CSStats14 Object
    ///
    /// @param  pCreateData Pointer to the CSStats14 Creation
    ///
    /// @return CamxResultSuccess if successful.
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static CamxResult Create(
        IFEStatsModuleCreateData* pCreateData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Execute
    ///
    /// @brief  Execute process capture request to configure module
    ///
    /// @param  pInputData Pointer to the ISP input data
    ///
    /// @return CamxResultSuccess if successful.
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual CamxResult Execute(
        ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// PrepareStripingParameters
    ///
    /// @brief  Prepare striping parameters for striping lib
    ///
    /// @param  pInputData Pointer to the Inputdata
    ///
    /// @return CamxResultSuccess if successful.
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual CamxResult PrepareStripingParameters(
        ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ~CSStats14
    ///
    /// @brief  Destructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual ~CSStats14();

protected:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// CSStats14
    ///
    /// @brief  Constructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CSStats14();

private:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ConfigureRegs
    ///
    /// @brief  Configure CS stats registers
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    VOID ConfigureRegs();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// AdjustHorizontalRegionNumber
    ///
    /// @brief  Adjust horizontal region number for hardware limitations which states h_num % 8 must be within [4,7]
    ///
    /// @param  regionHNum      horizontal region number
    /// @param  divider         divider for horizontal number
    /// @param  minRemainder    minimum remainder value to limit to
    ///
    /// @return adjusted horizontal number
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    UINT32 AdjustHorizontalRegionNumber(
        UINT32  regionHNum,
        UINT32  divider,
        UINT32  minRemainder);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// DumpRegConfig
    ///
    /// @brief  Print register configuration of CS module for debug
    ///
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    VOID DumpRegConfig();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// CheckDependency
    ///
    /// @brief  Check to see if the Dependencies have been met
    ///
    /// @param  pInputData Pointer to the ISP input data
    ///
    /// @return BOOL
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    BOOL CheckDependency(
        ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// UpdateIFEInternalData
    ///
    /// @brief  Update IFE internal data
    ///
    /// @param  pInputData Pointer to the ISP input data
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    VOID UpdateIFEInternalData(
        ISPInputData * pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// CreateCmdList
    ///
    /// @brief  Create the Command List
    ///
    /// @param  pInputData Pointer to the ISP input data
    ///
    /// @return CamxResult
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult CreateCmdList(
        ISPInputData* pInputData);

    CSStats14(const CSStats14&)            = delete;    ///< Disallow the copy constructor
    CSStats14& operator=(const CSStats14&) = delete;    ///< Disallow assignment operator

    IFECS14RegCmd       m_regCmd;       ///< Register list for CS stats
    ISPCSStatsConfig    m_CSConfig;     ///< RS configuration information
    UINT32              m_CAMIFWidth;   ///< CAMIF width
    UINT32              m_CAMIFHeight;  ///< CAMIF height
    UINT16              m_shiftBits;    ///< Number of bit shift required to get 16 bits row sum output
};

CAMX_NAMESPACE_END

#endif // CAMXIFECSSTATS14_H
